/**
 * @author 高小勇
 * 需要库文件
 * jquery-ui.js
 * buss.tree.js
 */
(function($,undefined){
	//var zTree;
	$.widget("ui.treeview",{
		options:{
			//Tree 唯一标识，主UL的ID
			treeObjId: "",
			//是否显示CheckBox
			checkable: false,
			//是否在编辑状态
			editable: false,
			//编辑状态是否显示修改按钮
			edit_renameBtn:true,
			//编辑状态是否显示删除节点按钮
			edit_removeBtn:true,
			//是否显示树的线
			showLine: true,
			//当前被选择的TreeNode
			curTreeNode: null,
			//当前正被编辑的TreeNode
			curEditTreeNode: null,
			//是否处于拖拽期间 0: not Drag; 1: doing Drag
			dragStatus: 0,
			dragNodeShowBefore: false,
			//选择CheckBox 或 Radio
			checkStyle: 'checkbox',
			//checkBox点击后影响父子节点设置（checkStyle=Check_Style_Radio时无效） 			
			checkType: {
				"Y": "ps",
				"N": "ps"
			},
			//radio 最大个数限制类型，每一级节点限制 或 整棵Tree的全部节点限制（checkStyle=Check_Style_Box时无效）
			checkRadioType:"all",
			//checkRadioType = Radio_Type_All 时，保存被选择节点的堆栈
			checkRadioCheckedList:[],
			//是否异步获取节点数据
			async: false,
			//获取节点数据的URL地址
			asyncUrl: "",
			//获取数据的熟悉名(new)
			asyncDataCol:"result",
			//获取节点数据时，必须的数据名称，例如：id、name
			asyncParam: [],
			//其它参数
			asyncParamOther: [],
			//简单Array数组转换为JSON嵌套数据参数
			isSimpleData: false,
			treeNodeKey: "",
			treeNodeParentKey: "",
			hasChildKey:"hasChild",
			//用户自定义名称列
			nameCol: "name",
			//用户自定义子节点列
			nodesCol: "nodes", 
			//用户自定义checked列
			checkedCol: "checked", 
			//折叠、展开特效速度
			expandSpeed: "fast",
			//折叠、展开Trigger开关
			expandTriggerFlag:false,
			//hover 增加按钮接口
			addHoverDom:null,
			//hover 删除按钮接口
			removeHoverDom:null,
			//永久自定义显示控件方法
			addDiyDom:null,
			//字体个性化样式接口
			fontCss:{},
			
			root: {
				isRoot: true,
				nodes: []
			},
			//event Function
			callback: {
				beforeClick:null,
				beforeRightClick:null,
				beforeMouseDown:null,
				beforeMouseUp:null,
				beforeChange:null,
				beforeDrag:null,
				beforeDrop:null,
				beforeRename:null,
				beforeRemove:null,
				beforeExpand:null,
				beforeCollapse:null,				
				nodeCreated:null,
				click:null,
				rightClick:null,
				mouseDown:null,
				mouseUp:null,
				change:null,
				drag:null,
				drop:null,
				rename:null,
				remove:null,
				expand:null,
				collapse:null,
				asyncSuccess:null,
				asyncError:null
			}			
		},
		_init:function(){
			
			this.element.addClass("tree");
			
			this.zTree = this.element.zTree(this.options,this.options.treeData);
		},
		getSelectedNode:function(){
			var node = this.zTree.getSelectedNode();
			return node;
		},
		getNodeByTId:function(tId){
			var node = this.zTree.getNodeByTId(tId);
			return node;
		},
		getNodeByParam:function(key,value){		
			//alert(this.zTree.length);
			var node = this.zTree.getNodeByParam(key,value);
			//alert($.trim(node.length));
			return node;
		},
		getNodesByParam:function(key,value){
			var node = this.zTree.getNodesByParam(key,value);
			return node;
		},
		getNodeIndex:function(treeNode){
			var index = this.zTree.getNodeIndex(treeNode);
			return index;
		},
		getNodes:function(){
			var nodes = this.zTree.getNodes();
			return nodes;
		},
		//获取选中或未选中的节点信息
		getCheckedNodes:function(checked){
			var nodes = this.zTree.getCheckedNodes(checked);
			return nodes;
		},
		getSetting:function(){
			return this.zTree.getSetting();
		},
		//将Array格式转换为zTree使用的标准格式,
		//使用此方法，请务必设置节点唯一标识属性名称 treeNodeKey 和 父节点唯一标识属性名称 treeNodeParentKey，并且让数据满足父子关系，注意：简单 Array 数据中必须要让父节点在子节点之前。
		transformTozTreeNodes:function(simpleTreeNodes){
			var nodes = this.zTree.transformTozTreeNodes(simpleTreeNodes);
			return nodes;
		},
		//将 zTree 使用的标准格式转换为简单 Array 格式，便于将数据返回给后台 。（简单遍历 Array 就能得到全部节点）
		transformToArray:function(treeNodes){
			var nodeArr = this.zTree.transformToArray(treeNodes);
			return nodeArr;
		},
		//在指定节点下增加子节点。
		//请通过 zTree 核心函数 zTree(setting, [zTreeNodes]) 运行后，返回的 zTreePlugin 对象执行此方法
		//指定的父节点，如果增加根节点，请设置 parentNode 为 null 即可
		addNodes:function(parentNode,newNodes,isSilent){
			var nodes = this.zTree.addNodes(parentNode,newNodes,isSilent);
			return nodes;
		},
		//让 zTree 展开全部节点。
		//展开 (true) 或 折叠 (false) 标识
		expandAll:function(expandSign){
			this.zTree.expandAll(expandSign);
		},
		expandNode:function(treeNode,expandSign,sonSign){
			this.zTree.expandNode(treeNode,expandSign,sonSign);
		},
		//将某节点移动到其他节点下。
		//targetNode:指定移动到的目标节点 JSON 数据，如果移入根节点，请设置 targetNode 为 null 即可
		//treeNode:指定被移动的节点 JSON 数据
		//moveType:"inner"：成为子节点（默认值），"before"：成为同级前一个节点，"after"：成为同级后一个节点
		moveNode:function(targetNode,treeNode,moveType){
			this.zTree.moveNode(targetNode,treeNode,moveType);
		},
		//刷新zTree
		refresh:function(){
			this.zTree.refresh();
		},
		//删除指定节点
		removeNode:function(treeNode){
			this.zTree.removeNode(treeNode);
		},
		//选中指定节点
		selectNode:function(treeNode){
			this.zTree.selectNode(treeNode);
		},
		//在 checkable 为 true 时，设置全部节点的选中状态。
		//true：全部选中；false：全部取消选中
		checkAllNodes:function(checked){
			this.zTree.checkAllNodes(checked);
		},
		//设置 zTree 是否为可拖拽的编辑状态。
		setEditable:function(editable){
			this.zTree.setEditable(true);
		},
		//将选中的节点设置为未被选中状态
		cancelSelectedNode:function(){
			this.zTree.cancelSelectedNode();
		},
		//更新某节点数据，主要用于该节点显示属性的更新。
		updateNode:function(treeNode,checkTypeFlag){
			this.zTree.updateNode(treeNode,checkTypeFlag);
		},
		//更新Tree当前配置信息,根据options的值进行更新
		updateSetting:function(){
			this.zTree.updateSetting(this.options);
		},
		//指定父节点进行异步加载子节点（已经加载过的父节点可反复使用此方法重新加载）。
		//reloadType = "refresh" 时，表明清空后重新加载，否则进行追加子节点处理。
		reAsyncChildNodes:function(parentNode,reloadType){
			
			this.zTree.reAsyncChildNodes(parentNode,reloadType);
		},
		//获取指定节点的前一个节点
		getPreTreeNode:function(treeNode){
			if(treeNode.isFirstNode) return null;
			var nodes = treeNode.parentNode ? treeNode.parentNode.nodes : this.zTree.getNodes();
			var preNode = null;
			for(var i = 0;i < nodes.length;i++){
				if(nodes[i] == treeNode){
					return preNode;
				}
				preNode = nodes[i];				
			}
			return preNode;
		},
		//获取指定节点的下一个节点
		getNextTreeNode:function(treeNode){
			if(treeNode.isLastNode) return null;
			var nodes = treeNode.parentNode ? treeNode.parentNode.nodes:this.zTree.getNodes();
			for(var i = 0;i < nodes.length;i++){
				if(nodes[i] == treeNode){
					return nodes[i + 1];
				}
			}
		},
		//节点移动
		moveTreeNode:function(move){
			var srcNode = this.zTree.getSelectedNode();
			if(!srcNode){
				return "请先选择一个节点";
			}
			var moveType = "inner";
			var targetNode = "";
			if(move == "up"){
				moveType = "before";
				targetNode = this.getPreTreeNode(srcNode);
			}else if(move=="down"){
				moveType = "after";
				targetNode = this.getNextTreeNode(srcNode);
			}else if(move == "left"){
				moveType = "after";
				targetNode = srcNode.parentNode;
			}else if(move == "right"){
				moveType = "inner";
				targetNode = this.getPreTreeNode(srcNode);				
			}
			if(srcNode && targetNode){
				this.zTree.moveNode(targetNode,srcNode,moveType);
			}
			this.zTtree.selectNode(srcNode);
			return "";
		}
		
	})
})(jQuery)
